#include "widget.h"
#include "ui_widget.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <QDebug>
#include <QMessageBox>

using namespace cv;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , m_hDevHandle(nullptr)
    , m_captureThread(nullptr)

{
    ui->setupUi(this);
    m_timer = new QTimer(this);
    // ui->radioContinueModel->setChecked(true);

    connect(ui->radioContinueModel,&QRadioButton::toggled,this,&Widget::onModeToggled);
    connect(ui->radioTriggerModel,&QRadioButton::toggled,this,&Widget::onModeToggled);

}

// widget.cpp
Widget::~Widget()
{
    // 先停止采集线程
    if (m_captureThread) {
        m_captureThread->stopCapture(); // 确保线程退出
        delete m_captureThread; // 释放线程对象
        m_captureThread = nullptr;
    }
    // 关闭相机设备
    if (m_hDevHandle) {
        MV_CC_StopGrabbing(m_hDevHandle);
        MV_CC_CloseDevice(m_hDevHandle);
        MV_CC_DestroyHandle(m_hDevHandle);
        m_hDevHandle = nullptr;
    }
    delete m_timer;
    delete ui;
}


void Widget::on_FindDevice_clicked()
{
    memset(&m_stDevList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));

    //枚举子网内所有设备
    int nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE,&m_stDevList);
    if (MV_OK != nRet)
    {
        QMessageBox::warning(this,"警告","未检测到设备！");
        return;
    }
    if (m_stDevList.nDeviceNum==0){
        QMessageBox::warning(this,"警告","未检测到设备！");
        return;
    }
    for(unsigned int i = 0; i < m_stDevList.nDeviceNum; i++)
    {
        MV_CC_DEVICE_INFO* pDeviceInfo = m_stDevList.pDeviceInfo[i];
        QString strModelName = "";
        if(pDeviceInfo->nTLayerType == MV_USB_DEVICE)
        {
            strModelName = (char*)pDeviceInfo->SpecialInfo.stUsb3VInfo.chModelName;
            ui->FindDevice->setText(strModelName);
            ui->OpenDevice->setEnabled(true);
            ui->FindDevice->setEnabled(false);
        }
        else if(pDeviceInfo->nTLayerType == MV_GIGE_DEVICE)
        {
            strModelName = (char*)pDeviceInfo->SpecialInfo.stGigEInfo.chModelName;
            ui->FindDevice->setText(strModelName);
            ui->OpenDevice->setEnabled(true);
            ui->FindDevice->setEnabled(false);
        }
        else
        {
            QMessageBox::warning(this,"警告","未知设备枚举！");
            return;
        }
        qDebug()<<"strModelName:"<<strModelName;

    }

}

void Widget::on_OpenDevice_clicked()
{
    if(m_bOpenDevice)
    {
        QMessageBox::information(this, "提示", "设备已处于打开状态");
        return;
    }
    if (m_stDevList.nDeviceNum == 0) {
        QMessageBox::warning(this, "警告", "未找到设备，请先查找设备");
        return;
    }

    // 如果已经打开设备，直接返回
    if (m_hDevHandle) {
        QMessageBox::information(this, "提示", "设备已处于打开状态");
        return;
    }

    // 创建设备句柄（打开第一个找到的设备）
    int nRet = MV_CC_CreateHandle(&m_hDevHandle, m_stDevList.pDeviceInfo[0]);
    if (MV_OK != nRet) {
        QMessageBox::warning(this, "警告", "创建设备句柄失败");
        return;
    }
    // 打开设备
    nRet = MV_CC_OpenDevice(m_hDevHandle);
    if (MV_OK != nRet) {
        MV_CC_DestroyHandle(m_hDevHandle);
        m_hDevHandle = nullptr;
        QMessageBox::warning(this, "警告", "打开设备失败");
        return;
    }


    // 打开设备后启用相关控件
    ui->OpenDevice->setEnabled(false);
    ui->CloseDevice->setEnabled(true);
    ui->groupBox_2->setEnabled(true);  // 启用采集组
    ui->groupParam->setEnabled(true);  // 启用参数组
    ui->bnStop->setEnabled(false);
    // QMessageBox::information(this, "提示", "设备打开成功");
}

void Widget::on_CloseDevice_clicked()
{
    // 先停止采集线程
    // if (m_captureThread) {
    //     m_captureThread->stopCapture(); // 确保线程退出
    //     delete m_captureThread; // 释放线程对象
    //     m_captureThread = nullptr;
    // }

    if (!m_hDevHandle) {
        QMessageBox::information(this, "提示", "设备未打开");
        return;
    }

    // 停止采集（如果正在采集）
    if (m_isGrabbing) {
        on_bnStop_clicked();
    }

    // 关闭设备并销毁句柄
    MV_CC_CloseDevice(m_hDevHandle);
    MV_CC_DestroyHandle(m_hDevHandle);
    m_hDevHandle = nullptr;

    // 关闭设备后禁用相关控件
    ui->OpenDevice->setEnabled(true);
    ui->CloseDevice->setEnabled(false);
    ui->groupBox_2->setEnabled(false);
    ui->groupParam->setEnabled(false);
    ui->imageLabel->clear();  // 清空图像显示
    // QMessageBox::information(this, "提示", "设备已关闭");
}


void Widget::on_bnStart_clicked()
{
    if (!m_hDevHandle) {
        QMessageBox::warning(this, "警告", "请先打开设备");
        return;
    }

    if (m_isGrabbing) {
        QMessageBox::information(this, "提示", "已处于采集状态");
        return;
    }



    // 根据单选按钮设置触发模式（连续模式/触发模式）
    if (ui->radioContinueModel->isChecked() || ui->radioTriggerModel->isChecked()) {
        // 启动取流
        int nRet = MV_CC_StartGrabbing(m_hDevHandle);
        if (MV_OK != nRet) {
            QMessageBox::warning(this, "警告", "启动取流失败");
            return;
        }
        // 创建并启动采集线程
        if (!m_captureThread) {
            m_captureThread = new ImageCaptureThread(m_hDevHandle, this);
            // 连接线程信号到主线程槽函数
            connect(m_captureThread, &ImageCaptureThread::imageCaptured,
                    this, &Widget::onImageCaptured);
            connect(m_captureThread, &ImageCaptureThread::errorOccurred,
                    this, &Widget::onCaptureError);
        }
        m_captureThread->start();
        m_isGrabbing = true;
        ui->bnStart->setEnabled(false);
        ui->bnStop->setEnabled(true);
        // QMessageBox::information(this, "提示", "正在取流");
        qDebug()<<"正在取流....";
    } else{
        QMessageBox::warning(this, "警告", "请先选择采集模式");
        return;
    }




}

// 停止采集按钮实现
void Widget::on_bnStop_clicked()
{
    if (!m_isGrabbing || !m_captureThread) {
        QMessageBox::information(this, "提示", "未处于采集状态");
        return;
    }

    if (m_captureThread) {
        m_captureThread->stopCapture();
        delete m_captureThread;
        m_captureThread = nullptr;
    }
    // 停止相机取流
    MV_CC_StopGrabbing(m_hDevHandle);
    m_isGrabbing = false;
    ui->bnStart->setEnabled(true);
    ui->bnStop->setEnabled(false);
    QMessageBox::information(this, "提示", "已停止取流");
}

// 处理采集到的图像（调试图片类型）
void Widget::onImageCaptured(const QImage& image)
{
    if (image.isNull()) {
        qDebug() << "接收为空图像";
        return;
    }

    // 在UI标签上显示图像（按比例缩放适应标签大小）
    QPixmap pixmap = QPixmap::fromImage(image);
    ui->imageLabel->setPixmap(pixmap.scaled(
        ui->imageLabel->size(),
        Qt::KeepAspectRatio, // 保持宽高比
        Qt::SmoothTransformation // 平滑缩放
        ));
    ui->imageLabel->setAlignment(Qt::AlignCenter); // 居中显示
}

// 处理采集错误
void Widget::onCaptureError(const QString& errorMsg)
{
    qDebug() << "采集错误:" << errorMsg;
    QMessageBox::warning(this, "采集错误", errorMsg);
}


// 实现槽函数：选择单选按钮后自动触发
void Widget::onModeToggled(bool checked)
{
    // 只处理“被选中”的情况（避免取消选中时触发）
    if (!checked) {
        return;
    }

    // 判断哪个按钮被选中
    if (sender() == ui->radioContinueModel) {
        // 连续模式逻辑
        qDebug() << "切换到连续模式";
        // 执行连续模式相关操作（如调用相机SDK设置）
        MV_CC_SetEnumValue(m_hDevHandle, "TriggerMode", 0); // 0通常表示关闭触发（连续模式）
    }
    else if (sender() == ui->radioTriggerModel) {
        // 触发模式逻辑
        qDebug() << "切换到触发模式";
        // 执行触发模式相关操作
        MV_CC_SetEnumValue(m_hDevHandle, "TriggerMode", 0); // 0通常表示关闭触发（连续模式）
    }
}
